package com.caipin.utils;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Map;

/**
 * @Author: zhunian0322@163.com
 * @DateTime: 2020-02-22 10:39
 * @Description: TODO
 */
public class GsonHelper {

    public enum GSONTYPE {
        STRING,
        INTEGER,
        JSON_ARRAY,
        JSON_OBJECT
    }

    private static Gson gson = null;

    static {
        if (gson == null) {
            gson = new Gson();
        }
    }

    /**
     * 返回指定 key 的值
     *
     * @param json
     * @param key
     * @param type 数据类型
     * @return
     */
    public static Object getField(String json, String key, GSONTYPE type) {
        if (StringUtils.isEmpty(json) || StringUtils.isEmpty(key)) {
            return null;
        }

        try {
            JSONObject object = new JSONObject(json);
            return getField(object, key, type);
        } catch (Exception e) {
            // e.printStackTrace();
        }
        return null;
    }

    public static Object getField(JSONObject object, String key, GSONTYPE type) {
        try {
            if (object.has(key)) {
                if (type == GSONTYPE.STRING) {
                    return object.getString(key);
                } else if (type == GSONTYPE.INTEGER) {
                    return object.getInt(key);
                } else if (type == GSONTYPE.JSON_ARRAY) {
                    return object.getJSONArray(key);
                } else if (type == GSONTYPE.JSON_OBJECT) {
                    return object.getJSONObject(key);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 以一个类型对象返回解析的 JSON
     *
     * @param JSONString
     * @param classOfT
     * @param <T>
     * @return
     */
    public static <T> T fromJson(String JSONString, Class<T> classOfT) {
        if (StringUtils.isEmpty(JSONString)) {
            return null;
        }

        T t = null;
        try {
            t = gson.fromJson(JSONString, classOfT);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return t;
    }

    /**
     * 将一个java对象转为json字符串
     *
     * @param jsonObject
     * @return
     */
    public static String toJsonString(Object jsonObject) {
        return gson.toJson(jsonObject);
    }

    public static String toJsonString(Map<String, Object> map) {
        JSONObject jsonObject = new JSONObject(map);
        return jsonObject.toString();
    }

    /**
     * 判断字符串是否为合法的 JSON 格式
     *
     * @param jsonStr
     * @return
     */
    public static boolean validate(String jsonStr) {
        JsonElement jsonElement;
        try {
            jsonElement = new JsonParser().parse(jsonStr);
        } catch (Exception e) {
            return false;
        }

        if (jsonElement == null) {
            return false;
        }

        return true;
    }

    /**
     * 解析纯 JSON Array
     *
     * @param JSONString
     * @param classOfT
     * @param <T>
     * @return
     */
    public static <T> ArrayList<T> parseNoHeaderArray(String JSONString, Class<T> classOfT) {
        if (StringUtils.isEmpty(JSONString)) {
            return null;
        }

        JsonParser jsonParser = new JsonParser();

        JsonArray jsonArray = null;
        try {
            jsonArray = jsonParser.parse(JSONString).getAsJsonArray();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

        ArrayList<T> ts = new ArrayList<>();

        for (JsonElement jsonElement : jsonArray) {
            T t = gson.fromJson(jsonElement, classOfT);
            ts.add(t);
        }

        return ts;

    }

}
